package com.zw.a.basic.a12.demo05_exercise;

import java.io.*;

//案例: 演示字符流拷贝文件.
/*
    字符流拷贝文件的方式:
        1. 高效字符流一次读写一个字符数组.
        2. 普通字符流一次读写一个字符数组.
        3. 高效字符流一次读写一个字符.
        4. 普通字符流一次读写一个字符.
        5. 转换流一次读写一个字符.
        6. 转换流一次读写一个字符数组.            这六种了解即可.

        7. 高效字符流独有的拷贝文件的方式.         一次读写一行,  必须掌握.
 */
public class Demo04 {
    public static void main(String[] args) throws IOException {
        //1. 普通字符流一次读写一个字符.
        //method01();

        //2. 普通字符流一次读写一个字符数组.
        //method02();

        //3.  高效字符流一次读写一个字符.
        //method03();

        //4.高效字符流一次读写一个字符数组.
        //method04();

        //5. 转换流一次读写一个字符.
        //method05();

        //6.转换流一次读写一个字符数组.
        //method06();

    }

    public static void method06() throws IOException {
        //1. 创建输入流对象, 关联数据源文件.
        InputStreamReader isr = new InputStreamReader(new FileInputStream("day12/data/1.txt"),"utf-8");   //这里不传码表, 就用默认码表(utf-8)
        //2. 创建输出流对象, 关联目的地文件.
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day12/data/2.txt"));      //因为使用默认码表, 所以码表名省略了.
        //3. 定义变量, 记录读取到的内容或者有效字节(符)数.
        int len = 0;
        char[] chs = new char[1024];
        //4. 循环读取,只要条件满足就一直读, 并将读取到的内容赋值给变量.
        while ((len = isr.read(chs)) != -1) {
            //5. 将读取到的内容写入到目的地文件中.
            osw.write(chs, 0, len);
        }
        //6. 关流, 释放资源.
        isr.close();
        osw.close();
    }

    public static void method05() throws IOException {
        //1. 创建输入流对象, 关联数据源文件.
        InputStreamReader isr = new InputStreamReader(new FileInputStream("day12/data/1.txt"),"utf-8");   //这里不传码表, 就用默认码表(utf-8)
        //2. 创建输出流对象, 关联目的地文件.
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day12/data/2.txt"));      //因为使用默认码表, 所以码表名省略了.
        //3. 定义变量, 记录读取到的内容或者有效字节(符)数.
        int len = 0;
        //4. 循环读取,只要条件满足就一直读, 并将读取到的内容赋值给变量.
        while ((len = isr.read()) != -1) {
            //5. 将读取到的内容写入到目的地文件中.
            osw.write(len);
        }
        //6. 关流, 释放资源.
        isr.close();
        osw.close();
    }

    public static void method04() throws IOException {
        //1. 创建输入流对象, 关联数据源文件.
        BufferedReader br = new BufferedReader(new FileReader("day12/data/1.txt"));
        //2. 创建输出流对象, 关联目的地文件.
        BufferedWriter bw = new BufferedWriter(new FileWriter("day12/data/2.txt"));
        //3. 定义变量, 记录读取到的内容或者有效字节(符)数.
        int len = 0;
        char[] chs = new char[1024];
        //4. 循环读取,只要条件满足就一直读, 并将读取到的内容赋值给变量.
        while ((len = br.read(chs)) != -1) {
            //5. 将读取到的内容写入到目的地文件中.
            bw.write(chs, 0, len);
        }
        //6. 关流, 释放资源.
        br.close();
        bw.close();
    }

    public static void method03() throws IOException {
        //1. 创建输入流对象, 关联数据源文件.
        //分解版写法
       /* FileReader fr = new FileReader("day12/data/1.txt");
        BufferedReader br = new BufferedReader(fr);*/
        //合并版写法
        BufferedReader br = new BufferedReader(new FileReader("day12/data/1.txt"));
        //2. 创建输出流对象, 关联目的地文件.
        BufferedWriter bw = new BufferedWriter(new FileWriter("day12/data/2.txt"));
        //3. 定义变量, 记录读取到的内容或者有效字节(符)数.
        int len = 0;
        //4. 循环读取,只要条件满足就一直读, 并将读取到的内容赋值给变量.
        while ((len = br.read()) != -1) {
            //5. 将读取到的内容写入到目的地文件中.
            bw.write(len);
        }
        //6. 关流, 释放资源.
        br.close();
        bw.close();
    }

    public static void method02() throws IOException {
        //1. 创建输入流对象, 关联数据源文件.
        FileReader fr = new FileReader("day12/data/1.txt");     //只能用默认码表读.
        //2. 创建输出流对象, 关联目的地文件.
        FileWriter fw = new FileWriter("day12/data/2.txt");     //只能用默认码表写.
        //3. 定义变量, 记录读取到的内容或者有效字节(符)数.
        int len = 0;
        char[] chs = new char[1024];
        //4. 循环读取,只要条件满足就一直读, 并将读取到的内容赋值给变量.
        while ((len = fr.read(chs)) != -1) {
            //5. 将读取到的内容写入到目的地文件中.
            fw.write(chs, 0, len);
        }
        //6. 关流, 释放资源.
        fr.close();
        fw.close();
    }

    public static void method01() throws IOException {
        //1. 创建输入流对象, 关联数据源文件.
        FileReader fr = new FileReader("day12/data/1.txt");     //只能用默认码表读.
        //2. 创建输出流对象, 关联目的地文件.
        FileWriter fw = new FileWriter("day12/data/2.txt");     //只能用默认码表写.
        //3. 定义变量, 记录读取到的内容或者有效字节(符)数.
        int len = 0;
        //4. 循环读取,只要条件满足就一直读, 并将读取到的内容赋值给变量.
        while ((len = fr.read()) != -1) {
            //5. 将读取到的内容写入到目的地文件中.
            fw.write(len);
        }
        //6. 关流, 释放资源.
        fr.close();
        fw.close();
    }
}
